from django.core.management.base import BaseCommand
from user_management.models import Permission, Menu, Role, RolePermission, MenuPermission


class Command(BaseCommand):
    help = '初始化RBAC系统的基础数据'

    def handle(self, *args, **options):
        self.stdout.write('开始初始化RBAC数据...')
        
        # 创建权限
        self.create_permissions()
        
        # 创建菜单
        self.create_menus()
        
        # 创建角色
        self.create_roles()
        
        self.stdout.write(self.style.SUCCESS('RBAC数据初始化完成！'))

    def create_permissions(self):
        """创建权限"""
        permissions_data = [
            # 用户管理权限
            {'name': '查看用户', 'code': 'user.view', 'module': '用户管理', 'description': '查看用户列表和详情'},
            {'name': '创建用户', 'code': 'user.create', 'module': '用户管理', 'description': '创建新用户'},
            {'name': '编辑用户', 'code': 'user.edit', 'module': '用户管理', 'description': '编辑用户信息'},
            {'name': '删除用户', 'code': 'user.delete', 'module': '用户管理', 'description': '删除用户'},
            {'name': '重置密码', 'code': 'user.reset_password', 'module': '用户管理', 'description': '重置用户密码'},
            
            # 用户组管理权限
            {'name': '查看用户组', 'code': 'usergroup.view', 'module': '用户管理', 'description': '查看用户组列表和详情'},
            {'name': '创建用户组', 'code': 'usergroup.create', 'module': '用户管理', 'description': '创建新用户组'},
            {'name': '编辑用户组', 'code': 'usergroup.edit', 'module': '用户管理', 'description': '编辑用户组信息'},
            {'name': '删除用户组', 'code': 'usergroup.delete', 'module': '用户管理', 'description': '删除用户组'},
            
            # 角色管理权限
            {'name': '查看角色', 'code': 'role.view', 'module': '用户管理', 'description': '查看角色列表和详情'},
            {'name': '创建角色', 'code': 'role.create', 'module': '用户管理', 'description': '创建新角色'},
            {'name': '编辑角色', 'code': 'role.edit', 'module': '用户管理', 'description': '编辑角色信息'},
            {'name': '删除角色', 'code': 'role.delete', 'module': '用户管理', 'description': '删除角色'},
            {'name': '分配权限', 'code': 'role.assign_permissions', 'module': '用户管理', 'description': '为角色分配权限'},
            
            # 权限管理权限
            {'name': '查看权限', 'code': 'permission.view', 'module': '用户管理', 'description': '查看权限列表和详情'},
            {'name': '创建权限', 'code': 'permission.create', 'module': '用户管理', 'description': '创建新权限'},
            {'name': '编辑权限', 'code': 'permission.edit', 'module': '用户管理', 'description': '编辑权限信息'},
            {'name': '删除权限', 'code': 'permission.delete', 'module': '用户管理', 'description': '删除权限'},
            
            # 菜单管理权限
            {'name': '查看菜单', 'code': 'menu.view', 'module': '用户管理', 'description': '查看菜单列表和详情'},
            {'name': '创建菜单', 'code': 'menu.create', 'module': '用户管理', 'description': '创建新菜单'},
            {'name': '编辑菜单', 'code': 'menu.edit', 'module': '用户管理', 'description': '编辑菜单信息'},
            {'name': '删除菜单', 'code': 'menu.delete', 'module': '用户管理', 'description': '删除菜单'},
            
            # CMDB管理权限
            {'name': '查看主机', 'code': 'host.view', 'module': 'CMDB管理', 'description': '查看主机列表和详情'},
            {'name': '创建主机', 'code': 'host.create', 'module': 'CMDB管理', 'description': '创建新主机'},
            {'name': '编辑主机', 'code': 'host.edit', 'module': 'CMDB管理', 'description': '编辑主机信息'},
            {'name': '删除主机', 'code': 'host.delete', 'module': 'CMDB管理', 'description': '删除主机'},
            {'name': 'SSH连接', 'code': 'host.ssh', 'module': 'CMDB管理', 'description': 'SSH连接到主机'},
            
            # SQL管理权限
            {'name': '查询SQL', 'code': 'sql.query', 'module': 'SQL管理', 'description': '执行SQL查询'},
            {'name': '提交变更', 'code': 'sql.submit', 'module': 'SQL管理', 'description': '提交SQL变更请求'},
            {'name': '审核SQL', 'code': 'sql.audit', 'module': 'SQL管理', 'description': '审核SQL变更请求'},
            {'name': '执行SQL', 'code': 'sql.execute', 'module': 'SQL管理', 'description': '执行SQL变更'},
            
            # 系统管理权限
            {'name': '系统设置', 'code': 'system.settings', 'module': '系统管理', 'description': '系统设置管理'},
            {'name': '日志查看', 'code': 'system.logs', 'module': '系统管理', 'description': '查看系统日志'},
        ]
        
        for perm_data in permissions_data:
            permission, created = Permission.objects.get_or_create(
                code=perm_data['code'],
                defaults=perm_data
            )
            if created:
                self.stdout.write(f'创建权限: {permission.name}')

    def create_menus(self):
        """创建菜单"""
        # 创建顶级菜单
        dashboard_menu = Menu.objects.get_or_create(
            path='/dashboard',
            defaults={
                'name': '仪表盘',
                'component': 'Dashboard',
                'icon': 'Dashboard',
                'sort_order': 1,
                'is_active': True
            }
        )[0]
        
        user_mgmt_menu = Menu.objects.get_or_create(
            path='/user-management',
            defaults={
                'name': '用户管理',
                'component': '',
                'icon': 'User',
                'sort_order': 2,
                'is_active': True
            }
        )[0]
        
        cmdb_menu = Menu.objects.get_or_create(
            path='/cmdb',
            defaults={
                'name': 'CMDB',
                'component': '',
                'icon': 'Server',
                'sort_order': 3,
                'is_active': True
            }
        )[0]
        
        sql_mgmt_menu = Menu.objects.get_or_create(
            path='/sql-management',
            defaults={
                'name': 'SQL管理',
                'component': '',
                'icon': 'Database',
                'sort_order': 4,
                'is_active': True
            }
        )[0]

        # 创建我的工单一级菜单
        my_tickets_menu = Menu.objects.get_or_create(
            path='/my-tickets',
            defaults={
                'name': '我的工单',
                'component': 'sql-management/MyTickets',
                'icon': 'Document',
                'sort_order': 5,
                'is_active': True
            }
        )[0]
        
        # 创建用户管理子菜单
        user_submenu_data = [
            {'name': '用户列表', 'path': '/user-management/users', 'component': 'user-management/Users', 'sort_order': 1},
            {'name': '用户组管理', 'path': '/user-management/user-groups', 'component': 'user-management/UserGroups', 'sort_order': 2},
            {'name': '角色管理', 'path': '/user-management/roles', 'component': 'user-management/Roles', 'sort_order': 3},
            {'name': '权限管理', 'path': '/user-management/permissions', 'component': 'user-management/Permissions', 'sort_order': 4},
            {'name': '菜单管理', 'path': '/user-management/menus', 'component': 'user-management/Menus', 'sort_order': 5},
        ]
        
        for submenu_data in user_submenu_data:
            Menu.objects.get_or_create(
                path=submenu_data['path'],
                defaults={
                    'parent': user_mgmt_menu,
                    'is_active': True,
                    **submenu_data
                }
            )
        
        # 创建CMDB子菜单
        cmdb_submenu_data = [
            {'name': '主机管理', 'path': '/cmdb/hosts', 'component': 'cmdb/Hosts', 'sort_order': 1},
            {'name': '远程连接管理', 'path': '/cmdb/remote-connections', 'component': 'cmdb/RemoteConnectionManager', 'sort_order': 2},
            {'name': '主机组管理', 'path': '/cmdb/host-groups', 'component': 'cmdb/HostGroups', 'sort_order': 3},
            {'name': '环境管理', 'path': '/cmdb/environments', 'component': 'cmdb/Environments', 'sort_order': 4},
            {'name': '主机类型', 'path': '/cmdb/host-types', 'component': 'cmdb/HostTypes', 'sort_order': 5},
        ]
        
        for submenu_data in cmdb_submenu_data:
            Menu.objects.get_or_create(
                path=submenu_data['path'],
                defaults={
                    'parent': cmdb_menu,
                    'is_active': True,
                    **submenu_data
                }
            )
        
        # 创建SQL管理子菜单
        sql_submenu_data = [
            {'name': 'SQL查询', 'path': '/sql/query', 'component': 'sql-management/QuerySQL', 'sort_order': 1},
            {'name': '变更申请', 'path': '/sql/submit', 'component': 'sql-management/SubmitSQL', 'sort_order': 2},
            {'name': 'SQL审核', 'path': '/sql/audit', 'component': 'sql-management/SQLAudit', 'sort_order': 3},
            {'name': '执行历史', 'path': '/sql/history', 'component': 'sql-management/SQLHistory', 'sort_order': 4},
        ]
        
        for submenu_data in sql_submenu_data:
            Menu.objects.get_or_create(
                path=submenu_data['path'],
                defaults={
                    'parent': sql_mgmt_menu,
                    'is_active': True,
                    **submenu_data
                }
            )
        
        self.stdout.write('菜单创建完成')

    def create_roles(self):
        """创建角色"""
        # 创建超级管理员角色
        admin_role, created = Role.objects.get_or_create(
            name='超级管理员',
            defaults={'description': '拥有系统所有权限的超级管理员'}
        )
        
        if created:
            # 为超级管理员分配所有权限
            all_permissions = Permission.objects.all()
            for permission in all_permissions:
                RolePermission.objects.get_or_create(
                    role=admin_role,
                    permission=permission,
                    defaults={'access_level': 'write'}
                )
            self.stdout.write('创建超级管理员角色并分配所有权限')
        
        # 创建运维工程师角色
        ops_role, created = Role.objects.get_or_create(
            name='运维工程师',
            defaults={'description': '负责系统运维和主机管理的工程师'}
        )
        
        if created:
            # 为运维工程师分配CMDB相关权限
            ops_permissions = Permission.objects.filter(module__in=['CMDB管理'])
            for permission in ops_permissions:
                RolePermission.objects.get_or_create(
                    role=ops_role,
                    permission=permission,
                    defaults={'access_level': 'write'}
                )
            self.stdout.write('创建运维工程师角色')
        
        # 创建开发工程师角色
        dev_role, created = Role.objects.get_or_create(
            name='开发工程师',
            defaults={'description': '负责应用开发和SQL管理的工程师'}
        )
        
        if created:
            # 为开发工程师分配SQL管理相关权限
            dev_permissions = Permission.objects.filter(module__in=['SQL管理'])
            for permission in dev_permissions:
                access_level = 'read' if permission.code in ['sql.audit', 'sql.execute'] else 'write'
                RolePermission.objects.get_or_create(
                    role=dev_role,
                    permission=permission,
                    defaults={'access_level': access_level}
                )
            self.stdout.write('创建开发工程师角色')
